#include "App_IO.h"

/* 存储数字对应字符 */
char input_buff[50] = {0};
/* 缓冲区存储的字符的长度 */
uint8_t input_buff_len = 0;

void App_IO_HandleInput(void);

static Pwd_Handle_State_t pwd_state = CHECK_PWD;
extern TaskHandle_t finger_scan_task_handle;
extern TaskHandle_t ota_task_handle;

void App_IO_Start(void)
{

    MY_LOGI("初始化触摸按键");
    Inf_SC12B_Init();
    MY_LOGI("初始化LED");
    Inf_Led_Init();
    MY_LOGI("初始化语音");
    Inf_WTN6_Init();
    MY_LOGI("初始化nvs");
    Dri_NVS_Init();
    MY_LOGI("初始化电机");
    Inf_BDR6120_Init();
    MY_LOGI("初始化指纹模块");
    Inf_FPM383_Init();
}

// 按键类型 数字 sharp M
// sharp 表示输入的结束
// M 保留，输入m，不处理，并且输出语音非法操作
/*
定义输入状态机：
free    默认状态    在free状态下，有状态按下，激活键盘
    然后进入input状态
input   输入状态    读取输入的键，然后存储
    如果遇到sharp表示输入结束，如果m表述非法输入回到free
complete结束状态
    对输入进行处理
    处理结束进入free状态
 */
void App_IO_TouchKeyScan(void)
{

    Touch_Key_t key = Inf_SC12B_ReadTouchKey();
    static Input_Status_t state = FREE;

    if (key == key_null)
    {
        state = FREE;
        Inf_Led_LightALl(black);

        return;
    }

    switch (state)
    {
    case FREE: // 在free状态下，有按键按下，激活键盘
    {
        Inf_Led_LightALl(white);
        memset(input_buff, 0, sizeof(input_buff));
        input_buff_len = 0;
        state = INPUT;

        pwd_state = CHECK_PWD;
        break;
    }
    case INPUT:
    {
        sayWaterDrop();
        Inf_Led_LightKeyLed(key, red);
        if (key == Key_M)
        {
            sayIllegalOperation();
            state = FREE;
        }
        else if (key == key_sharp)
        {
            // 对输入进行处理
            App_IO_HandleInput();

            if (pwd_state == ADD_PWD || pwd_state == DEL_PWD)
            {
                memset(input_buff, 0, sizeof(input_buff));
                input_buff_len = 0;
            }
            else
            {
                state = FREE;
                vTaskDelay(500);
                Inf_Led_LightALl(black);
            }
        }
        else
        {
            input_buff[input_buff_len++] = key + '0';
        }
        break;
    }

    default:
        break;
    }
}
/*
命令：  2个数字表示命令
    密码相关
        00  添加密码
        01  删除密码
    指纹相关
        10  录入指纹
        11  删除指纹
    ota相关
        20  升级固件
密码：
    >=6 输入的是密码

错误：
    <=1 || ==3 ==4 ==5
 */
void App_IO_HandleInput(void)
{
    MY_LOGE("输入：%s", input_buff);

    if (input_buff_len <= 1 || input_buff_len == 3 || input_buff_len == 4 || input_buff_len == 5)
    {
        sayIllegalOperation();
    }
    else if (input_buff_len == 2)
    {
        // 命令
        if (input_buff[0] == '0')
        {
            if (input_buff[1] == '0')
            {
                sayAddUser();
                vTaskDelay(1000);
                sayInputUserPassword();

                pwd_state = ADD_PWD;
            }
            else if (input_buff[1] == '1')
            {
                sayDelUser();
                vTaskDelay(1000);
                sayInputUserPassword();

                pwd_state = DEL_PWD;
            }
        }
        else if (input_buff[0] == '1')
        {
            // 指纹相关操作 '0' '1'发送
            xTaskNotify(finger_scan_task_handle, (uint32_t)input_buff[1], eSetValueWithOverwrite);
        }
        else if (input_buff[0] == '2')
        {
            // ota
            xTaskNotify(ota_task_handle, (uint32_t)input_buff[1], eSetValueWithOverwrite);
        }
    }
    else
    {
        // 输入密码

        if (pwd_state == ADD_PWD)
        { // 添加密码
            MY_LOGE("添加密码 %s", input_buff);
            App_IO_AddPwd();
            pwd_state = CHECK_PWD;
        }
        else if (pwd_state == DEL_PWD)
        { // 删除密码
            MY_LOGE("删除密码 %s", input_buff);

            App_IO_DelPwd();
            pwd_state = CHECK_PWD;
        }
        else if (pwd_state == CHECK_PWD)
        { // 验证密码
            MY_LOGE("验证密码 %s", input_buff);

            App_IO_CheckPwd();
        }
    }
}

/*
密码存储
    存储到什么地方
        非易失性存储设备
        nvs esp32内部flash
    存储的格式
        键值对形式
 */
void App_IO_AddPwd(void)
{
    esp_err_t err = Dri_NVS_WrriteInt8(input_buff, 0);

    if (err == ESP_OK)
    {
        MY_LOGE("密码 %s 添加成功", input_buff);
        sayPasswordAddSucc();
    }
    else
    {
        MY_LOGE("密码 %s 添加失败", input_buff);
        sayPasswordAddFail();
    }
}

void App_IO_DelPwd(void)
{
    esp_err_t err = Dri_NVS_DelKey(input_buff);

    if (err == ESP_OK)
    {
        MY_LOGE("密码 %s 删除成功", input_buff);
        sayPassword();
        vTaskDelay(500);
        sayDelSucc();
    }

    else
    {
        MY_LOGE("密码 %s 删除失败", input_buff);
        sayPassword();
        vTaskDelay(500);
        sayDelFail();
    }
}

void App_IO_CheckPwd(void)
{

    if (Dri_NVS_IsKeyMatched(input_buff) == ESP_OK)
    {
        MY_LOGE("密码 %s 验证成功", input_buff);
        sayPasswordVerifySucc();
        Inf_BDR6120_OpenLock();
        sayDoorOpen();
    }
    else
    {
        MY_LOGE("密码 %s 验证失败", input_buff);
        sayPasswordVerifyFail();
    }
}

void App_IO_FingerScan(void)
{
    uint32_t action = 0;
    static Finger_State_t state = finger_check;
    xTaskNotifyWait(0, 0, &action, portMAX_DELAY);
    if (action == '0')
    {
        LED_GREEN_FLICKER;

        sayAddUserFingerprint();
        vTaskDelay(1500 / portTICK_PERIOD_MS);
        sayPlaceFinger();

        state = finger_add;
    }
    else if (action == '1')
    {
        LED_RED_FLICKER;
        sayDelUserFingerprint();
        vTaskDelay(1500 / portTICK_PERIOD_MS);
        sayPlaceFinger();

        state = finger_del;
    }
    else if (action == '2')
    {
        switch (state)
        {
        case finger_add:
        {

            MY_LOGE("录入指纹");

            Inf_FPM383_AutoEnroll();
            LED_COLOR_OFF;
            break;
        }
        case finger_del:
        {
            MY_LOGE("删除指纹");
            Inf_FPM383_DelFinger();
            LED_COLOR_OFF;

            break;
        }
        case finger_check:
        {
            LED_BLUE_ON;
            MY_LOGE("验证指纹");

            Inf_FPM383_AoutoVerify();
            LED_COLOR_OFF;

            break;
        }
        default:
            break;
        }
        Inf_FPM383_Sleep();
        state = finger_check;
    }
}

void App_IO_Nvs_Test(void)
{
    // // 测试nvs读写
    // Dri_NVS_WrriteInt8("345678", 0);
    // Dri_NVS_WrriteInt8("123456", 0);
    // Dri_NVS_WrriteInt8("223344", 0);
    // if (Dri_NVS_IsKeyMatch("1234") == ESP_OK)
    // {
    //     MY_LOGE("1234 查找成功");
    // }
    // else
    // {
    //     MY_LOGE("1234 查找失败");
    // }
    // if (Dri_NVS_IsKeyMatch("123456") == ESP_OK)
    // {
    //     MY_LOGE("123456 查找成功");
    // }
    // else
    // {
    //     MY_LOGE("123456 查找失败");
    // }
    // if (Dri_NVS_DelKey("123456") == ESP_OK)
    // {
    //     MY_LOGE("123456 删除成功");
    // }
    // else
    // {
    //     MY_LOGE("123456 删除失败");
    // }
    // if (Dri_NVS_IsKeyMatch("123456") == ESP_OK)
    // {
    //     MY_LOGE("123456 查找成功");
    // }
    // else
    // {
    //     MY_LOGE("123456 查找失败");
    // }
}